home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / randbg / src / randbg.c
C/C++ Source or Header  |  1993-07-08  |  6KB  |  283 lines

  1. /************************************************************************/
  2. /*                                                                        */
  3. /*                        RandBG.c for T-OS V2.1L20                        */
  4. /*                                                                        */
  5. /**************************************** copyright 1992 T.Nakatani *****/
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <time.h>
  11. #include <ctype.h>
  12. #include <sys\stat.h>
  13. #include <dos.h>
  14. #include <fcntl.h>
  15.  
  16.  
  17. #ifdef LSI_C
  18.  
  19. #define _O_RDONLY O_RDONLY
  20. #define _O_WRONLY O_WRONLY
  21. #define _O_RDWR   O_RDWR
  22. #define COPYBUFSIZE 57344
  23.  
  24. #endif
  25.  
  26. #ifdef __HIGHC__
  27.  
  28. #define COPYBUFSIZE tifsize
  29.  
  30. #endif
  31.  
  32. char sclfile[80];
  33. char target[80];
  34. char drive;
  35. unsigned long dskfree, tifsize;
  36. #ifdef TIMER
  37. unsigned long before, after;
  38. #endif
  39.  
  40. void errexit()
  41. {
  42.     printf("RANDBG:%sは更新されません。\n", target);
  43.     exit(1);
  44.  
  45. }
  46.  
  47. int copy(char *name1, char *name2)
  48. {
  49.  
  50.     FILE *fr,*fw;
  51.     unsigned dt, tm;
  52.     char *buf;
  53.     long remain = tifsize, done, i;
  54. #ifdef TIMER
  55. #ifdef LSI_C
  56.     struct dostime_t cl;
  57.  
  58.     _dos_gettime(&cl);
  59.     before = (unsigned long)cl.hsecond + (unsigned long)cl.second*100L +
  60.             (unsigned long)cl.minute*6000L + (unsigned long)cl.hour*360000L;
  61. #endif
  62. #ifdef __HIGHC__
  63.     before = clock();
  64. #endif
  65. /*
  66.     printf("COPY:%s to %s\n", name1, name2);
  67.     printf("TIF:%ld(%ld)\n",tifsize,remain);
  68. */
  69. #endif
  70.     fr = fopen(name1, "rb");
  71.     if (fr == NULL) {
  72.         printf("RANDBG:%sがオープン出来ません。\n",name1);
  73.         errexit();
  74.     }
  75.     fw = fopen(name2, "wb");
  76.     if (fw == NULL) {
  77.         printf("RANDBG:%sがオープン出来ません。\n",name2);
  78.         fclose(fr);
  79.         errexit();
  80.     }
  81.  
  82.     if ((buf = malloc(COPYBUFSIZE)) == NULL) {
  83. #ifdef __HIGHC__
  84.         if ((buf = malloc(154112)) == NULL) {
  85.             clearerr(fr);
  86.             for (i = 0; i < remain; i++) {
  87.                 fputc(fgetc(fr), fw);
  88.             }
  89.         }
  90. #else
  91.         clearerr(fr);
  92.         for (i = 0; i < remain; i++) {
  93.             fputc(fgetc(fr), fw);
  94.         }
  95. #endif
  96.     }
  97.  
  98.     if (buf != NULL) {
  99.         while (remain > 0L) {
  100.             done = ((remain < COPYBUFSIZE) ? remain : COPYBUFSIZE);
  101.             fread(buf, 1, done, fr);
  102.             fwrite(buf, 1, done, fw);
  103.             remain -= done;
  104.         }
  105.     }
  106.  
  107.     if ( _dos_getftime(fileno(fr), &dt, &tm) == 0)
  108.         _dos_setftime(fileno(fw), dt, tm);
  109.  
  110.     fclose(fr);
  111.     fclose(fw);
  112. #ifdef TIMER
  113. #ifdef LSI_C
  114.     _dos_gettime(&cl);
  115.     after = (unsigned long)cl.hsecond + (unsigned long)cl.second*100L +
  116.             (unsigned long)cl.minute*6000L + (unsigned long)cl.hour*360000L;
  117. #endif
  118. #ifdef __HIGHC__
  119.     after = clock();
  120. #endif
  121.     printf("実質コピー時間:%2ld.%02ld秒\n", (after-before)/100L, (after-before)%100L);
  122. #endif
  123.  
  124.     return (0);
  125. }
  126.  
  127. void randbg()
  128. {
  129.     FILE *fp;
  130.     int i, ret = 1;
  131.     int rnd;
  132.     unsigned long seed;
  133.     int maxc, times = 0;
  134.     int len;
  135.     char *buf, *now;
  136.     struct stat sbuf;
  137.     struct find_t fcb;
  138.     struct diskfree_t dinf;
  139.     char tiffile[80];
  140.     long clsize;
  141.  
  142.     if (_dos_getdiskfree(drive - 0x40, &dinf) != 0) {
  143.         printf("RANDBG:%cドライブには出力出来ません\n", drive);
  144.         errexit();
  145.     }
  146.     else {
  147.         clsize = (long)dinf.sectors_per_cluster * (long)dinf.bytes_per_sector;
  148.         dskfree = (long)dinf.avail_clusters * clsize;
  149.     }
  150.  
  151.     if (_dos_findfirst(target,
  152.         _A_ARCH | _A_HIDDEN | _A_NORMAL | _A_RDONLY, &fcb) == 0) {
  153.             dskfree += ((((fcb.size - 1) / clsize) + 1L) * clsize);
  154.     }
  155.  
  156.     if (stat(sclfile, &sbuf) != 0) {
  157.         printf("RANDBG:スケジュールファイルが見つかりません。\n");
  158.         errexit();
  159.     }
  160.  
  161.     buf = malloc(sbuf.st_size + 1);
  162.  
  163.     if (buf == NULL) {
  164.         printf("RANDBG:スケジュールファイルのサイズが大きすぎます。");
  165. #ifdef LSI_C
  166.         printf("EXP版を使用してください。");
  167. #endif
  168.         printf("\n");
  169.         errexit();
  170.     }
  171.  
  172.     if ((fp = fopen(sclfile, "rt")) == NULL) {
  173.         printf("RANDBG:スケジュールファイルが見つかりません。\n");
  174.         errexit();
  175.     }
  176.  
  177.     len = fread(buf, 1, sbuf.st_size, fp);
  178.     fclose(fp);
  179.     buf[len] = '\0';
  180.  
  181.     now = buf;
  182.     maxc = 0;
  183.     while (now != NULL) { /* 行数を数えている */
  184.         maxc++;
  185.         now++;
  186.         now = strchr(now, '\n');
  187.     }
  188.  
  189.     seed = clock();
  190.     srand(seed);
  191.  
  192.     while (ret != 0) {
  193.         rnd = rand() % maxc;
  194.         now = buf;
  195.         if (rnd > 0) {
  196.             for (i = 0; i < rnd; i++) {
  197.                 now = strchr(now, '\n') + 1;
  198.             }
  199.         }
  200.         sscanf(now, "%[^\n\t  ]", tiffile);
  201.         if (*now == '\0') continue;
  202.         ret = _dos_findfirst(tiffile,
  203.             _A_ARCH | _A_HIDDEN | _A_NORMAL | _A_RDONLY, &fcb);
  204.         tifsize = fcb.size;
  205.  
  206.         if ((ret == 0) && (dskfree < tifsize)) {
  207.             printf("RANDBG:%cドライブの空き容量が小さいか、<%s>のサイズが大きすぎます。他のファイルを探します。\n", drive, tiffile);
  208.             ret = -1;
  209.         }
  210.  
  211.         times++;
  212.         if (times > maxc) {
  213.             printf("RANDBG:使用出来ないファイルまたはコメント行が多すぎます。\n");
  214.             errexit();
  215.         }
  216. /*
  217.         printf("seed = %ld / rnd = %d / maxc = %d\n", seed, rnd, maxc);
  218. */
  219.     }
  220.  
  221.     free(buf);
  222.  
  223.     copy(tiffile, target);
  224.  
  225. }
  226.  
  227. void swchk(int argc, char **argv)
  228. {
  229.     int i;
  230.     unsigned int driveno;
  231.  
  232.     if (argc < 4) {
  233.         printf("Background Screen Random Exchenger for T-OS V2.1L20 copyright 1992 T.Nakatani\n");
  234.     }
  235.  
  236.     sclfile[0] = '\0';
  237.     drive =0;
  238.     *target = '\0';
  239.  
  240.     for (i = 1; i < ((argc < 3) ? argc: 3); i++) {
  241.         switch(argv[i][0]) {
  242.         case '@':
  243.             strcpy(sclfile,&argv[i][1]);
  244.             break;
  245.         case '/':
  246.             if ((argv[i][2] == '\0') || *(strchr(argv[i], '\0') - 1) == ':') {
  247.                 drive = toupper(argv[i][1]);
  248.             }
  249.             else {
  250.                 strcpy(target, &(argv[i][1]));
  251.             }
  252.             break;
  253.         default:
  254.             printf("USAGE: randbg @d:\\exe\\randbg.scl /d:\n               ^^^^^^^^^^^^^^^^^  ^^\n               .SCLfile(fullpath) SYSTEM-Drive\n");
  255.             strcpy(target, "TMENU.TIF");
  256.             errexit();
  257.         }
  258.     }
  259.  
  260.     if (sclfile[0] == '\0') {
  261.         strcpy(sclfile,argv[0]);
  262.         strcpy(strrchr(sclfile, '.'), ".scl");
  263.     }
  264.  
  265.     if (drive == 0) {
  266.         _dos_getdrive(&driveno);
  267.         drive = 0x40 + driveno;
  268.         if (*target == '\0') {
  269.             sprintf(target, "%c:\\TMENU.TIF", drive);
  270.         }
  271.     }
  272. }
  273.  
  274. int main(int argc,char **argv)
  275. {
  276.  
  277.     swchk(argc,argv);
  278.  
  279.     randbg();
  280.  
  281.     return (0);
  282. }
  283.